﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Negocio.Entidades;
using Negocio.Gestores;
using System.Data;

namespace autogestionAVEIT
{
    public partial class Facturacion : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!Page.IsPostBack)
            {
                try
                {
                    cargarCombos();                    
                }
                catch (Exception)
                {
                    panel_mensaje.Visible = true;
                    lblMensajeHeader.Text = "Error al cargar la página. Intentelo nuevamente. ";
                    panel_cuerpo.Visible = false;
                    panel_footer.Visible = false;
                    panel_grilla.Visible = false;
                }

            }
        }

        private void cargarCombos()
        {
            try
            {
                ddlTipoIVA.DataTextField = "descripcion";
                ddlTipoIVA.DataValueField = "id_tipoIVA";
                ddlTipoIVA.DataSource = GestorCliente.obtenerTipoIVA();
                ddlTipoIVA.DataBind();
                ddlTipoIVA.Items.Insert(0, new ListItem("Condicion frente al IVA", "0"));
                ddlTipoIVA.SelectedIndex = 0;  // opcion insertada en la primera posicion

                ddlTipoPago.DataTextField = "descripcion";
                ddlTipoPago.DataValueField = "id_tipoPago";
                ddlTipoPago.DataSource = GestorCliente.obtenerTipoPago();
                ddlTipoPago.DataBind();
                ddlTipoPago.Items.Insert(0, new ListItem("Tipo de Pago", "0"));
                ddlTipoPago.SelectedIndex = 0;  // opcion insertada en la primera posicion

                
            }
            catch (Exception e)
            {
                throw new ApplicationException(e.Message);
            }
        }

        protected void GVBoletas_SelectedIndexChanged(object sender, EventArgs e)
        {
            var id = GVBoletas.SelectedValue;
            lblMensajeHeader.Text = "";
        }

        protected void GVBoletas_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GVBoletas.PageIndex = e.NewPageIndex;
            cargarBoletasDelSocio(int.Parse(txtNroSocio.Text));
            GVBoletas.SelectedIndex = -1;
        }

        protected void btn_BuscarSocio_Click(object sender, EventArgs e)
        {
            string mensaje = "";
            bool cargoSocio = false;
            try
            {
                GVBoletas.PageIndex = 0; 
                mensaje = "No se pudo cargar el socio. ";
                cargarCamposDelSocio(int.Parse(txtNroSocio.Text));
                cargoSocio = true;
                mensaje = "No se pudo cargar las boletas correspondientes. ";
                cargarBoletasDelSocio(int.Parse(txtNroSocio.Text));
            }
            catch (Exception)
            {
                panel_mensaje.Visible = true;
                limpiarMensajes();
                lblMensajeHeader.Text = mensaje;
                if (!cargoSocio)
                    limpiarCampos();
            }
        }

        private void cargarBoletasDelSocio(int numero_socio)
        {
            try
            {
                List<Boleta> boletas = GestorRifas.obtenerBoletasDeSocio(numero_socio);
                GVBoletas.DataSource = boletas;
                
                int i = 1;
                foreach (Cupon c in boletas[0].cupones)
                {
                    GVBoletas.Columns[i + 2].HeaderText = "Cupon nº" + i.ToString();
                    GVBoletas.Columns[i + 2].Visible = true;
                    i++;
                }
                
                GVBoletas.DataBind();
                i=0;
                foreach (Boleta boleta in boletas)
                {
                    foreach (Cupon cupon in boleta.cupones)
                    {
                        if (cupon.fechaPagada != null)
                        { 
                            (GVBoletas.Rows[i].Cells[cupon.numero_cuota + 3].FindControl("chkCupon" + cupon.numero_cuota.ToString()) as CheckBox).Checked = true;
                            (GVBoletas.Rows[i].Cells[cupon.numero_cuota + 3].FindControl("chkCupon" + cupon.numero_cuota.ToString()) as CheckBox).Enabled = false;
                        }
                    }
                    i++;
                }
                panel_mensaje.Visible = false;
                lblMensajeHeader.Text = "";
                
            }
            catch (Exception ex)
            {

                throw new ApplicationException(ex.Message);
            }
        }

        private void cargarCamposDelSocio(int numero_socio)
        {
            try
            {
                Socio s = GestorSocio.ObtenerSocio(numero_socio);
                txtDocumento.Text = s.numero_dni.ToString();
                txtNombre.Text = s.nombre;
                txtApellido.Text = s.apellido;
                txtDomicilio.Text = s.domicilio.calle + " nº " + s.domicilio.numero.ToString() + ". ";
                if (s.domicilio.piso.HasValue)
                    txtDomicilio.Text += "Piso: " + s.domicilio.piso;
                if (s.domicilio.departamento != null)
                    txtDomicilio.Text += " " + s.domicilio.departamento.ToString();
                if (s.domicilio.barrio != null)
                    txtDomicilio.Text += " " + ". Barrio: " + s.domicilio.barrio; 
            }
            catch (Exception ee)
            {
                throw new ApplicationException(ee.Message);
            }
            
        }

        private void limpiarCampos()
        {
            txtNroSocio.Text = "";
            txtDocumento.Text = "";
            txtNombre.Text = "";
            txtApellido.Text = "";
            txtDomicilio.Text = "";
            GVBoletas.DataSource = null;
            GVBoletas.DataBind();
            txtSubTotal.Text = "";
            txtTotal.Text = "";
            txtIVA.Text = "";
            ddlTipoIVA.SelectedIndex = 0;
            ddlTipoPago.SelectedIndex = 0;
            
        }

        protected void limpiarMensajes()
        {
            lblMensajeHeader.Text = "";
            lblMensajeHeader.CssClass = "alert-danger";
        }

        protected void btnAsignarBoletas_Click(object sender, EventArgs e)
        {
            try
            {
                GestorRifas.asignarBoletasASocios(DateTime.Today.Year);
            }
            catch (Exception e2)
            {
                panel_mensaje.Visible = true;
                lblMensajeHeader.Text = "No se pudo asignar las boletas. "+e2.Message;
            }
            
        }

        protected void btnGrabarFactura_Click(object sender, EventArgs e)
        {
            try
            {
                calcularCuotasaPagar();
                Factura f = new Factura();
                f.fechaFactura = DateTime.Now.Date.ToShortDateString();
                f.id_tipoFactura = 3;

                if (int.Parse(ddlTipoIVA.SelectedValue) != 0)
                    f.id_tipoIVA = int.Parse(ddlTipoIVA.SelectedValue);
                else
                    throw new ApplicationException("No se seleccionó Condición frente al IVA. ");

                if (int.Parse(ddlTipoPago.SelectedValue) != 0)
                    f.id_tipoPago = int.Parse(ddlTipoPago.SelectedValue);
                else
                    throw new ApplicationException("No se seleccionó tipo de Pago. ");

                if (txtNroSocio.Text != "" && txtNombre.Text != "")
                    f.numeroSocio = int.Parse(txtNroSocio.Text);
                else
                    throw new ApplicationException("No hay ningun Socio Cargado. ");

                if (txtTotal.Text!="")
                    f.total = float.Parse(txtTotal.Text);
                
                f.cupones = new List<Cupon>();
                DataTable Cantcupones = GestorRifas.obtenerCuponesDeBoleta(int.Parse(GVBoletas.Rows[0].Cells[0].Text));
                foreach (GridViewRow fila in GVBoletas.Rows)
                {
                    for (int i = 0; i < Cantcupones.Rows.Count; i++)
                    {
                        if ((fila.Cells[i + 3].FindControl("chkCupon" + (i + 1).ToString()) as CheckBox).Enabled && (fila.Cells[i + 3].FindControl("chkCupon" + (i + 1).ToString()) as CheckBox).Checked)
                        {
                            Cupon c= new Cupon();
                            c.registroBoleta = int.Parse(fila.Cells[0].Text);
                            c.numero_cuota = (i + 1);
                            f.cupones.Add(c);
                        }
                    }
                }
                    
                if(f.cupones.Count>0)
                    f.numeroFactura = GestorRifas.grabarFactura(f);
                else
                    throw new ApplicationException("No hay cupones seleccionados. ");

                panel_mensaje.Visible = true;
                lblMensajeHeader.Text = "Se grabó la factura nº"+f.numeroFactura.ToString();
                lblMensajeHeader.CssClass = "alert-success";
                limpiarCampos();
            }
            catch (Exception e4)
            {
                limpiarMensajes();
                panel_mensaje.Visible = true;
                lblMensajeHeader.Text = "Error al grabar la factura. " + e4.Message;
            }
        }

        protected void btnCalcularImporte_Click(object sender, EventArgs e)
        {
            try
            {
                if(GVBoletas.Rows.Count>0)
                {
                    calcularCuotasaPagar();  
                }
            }
            catch (Exception e3)
            {
                panel_mensaje.Visible = true;
                lblMensajeHeader.Text = "Error al calcular el importe. " + e3.Message;
            }
            limpiarMensajes();
        }

        private void calcularCuotasaPagar()
        {
            float subtotal = 0;
            try
            {
                DataTable cupones = GestorRifas.obtenerCuponesDeBoleta(int.Parse(GVBoletas.Rows[0].Cells[0].Text));
                foreach (GridViewRow fila in GVBoletas.Rows)
                {
                     for (int i = 0; i < cupones.Rows.Count; i++)
                     {
                         if ((fila.Cells[i + 3].FindControl("chkCupon" + (i + 1).ToString()) as CheckBox).Enabled && (fila.Cells[i + 3].FindControl("chkCupon" + (i + 1).ToString()) as CheckBox).Checked)
                             subtotal += float.Parse(cupones.Rows[i]["importe"].ToString());
                     }
                }

                txtSubTotal.Text = subtotal.ToString();
                txtIVA.Text = (subtotal * 0.21).ToString("R");
                txtTotal.Text = (subtotal * 1.21).ToString("R");
            }
            catch (Exception)
            {
                throw new ApplicationException("Error al calcular el importe. ");
            }
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            limpiarCampos();
            limpiarMensajes();
        }
    }
}